From 767927aef309761754ce9da8062e20521761b6e0 Mon Sep 17 00:00:00 2001 From: Georges Basile Stavracas Neto Date: Mon, 10 Apr 2017 18:59:33 -0300 Subject: [PATCH] places-view: monitor network GtkPlacesView exposes local access points and network shares transparently by using the 'network:///' URI, which is handled by GIO. Currently, however, it doesn't monitor the network for new available points, such as computers that just join the network. It may happen too that the backend won't find all the networks before the network enumeration finishes. Fix that by keeping a file monitor inspecting the network uri, and update the places list when that happens. https://bugzilla.gnome.org/show_bug.cgi?id=781162 --- gtk/gtkplacesview.c | 38 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) diff --git a/gtk/gtkplacesview.c b/gtk/gtkplacesview.c index 7d4a6ddf14..12b556873c 100644 --- a/gtk/gtkplacesview.c +++ b/gtk/gtkplacesview.c @@ -56,6 +56,7 @@ struct _GtkPlacesViewPrivate GFile *server_list_file; GFileMonitor *server_list_monitor; + GFileMonitor *network_monitor; GCancellable *cancellable; @@ -397,6 +398,7 @@ gtk_places_view_destroy (GtkWidget *widget) priv->destroyed = 1; g_signal_handlers_disconnect_by_func (priv->volume_monitor, update_places, widget); + g_signal_handlers_disconnect_by_func (priv->network_monitor, update_places, widget); g_cancellable_cancel (priv->cancellable); g_cancellable_cancel (priv->networks_fetching_cancellable); @@ -417,6 +419,7 @@ gtk_places_view_finalize (GObject *object) g_clear_object (&priv->server_list_file); g_clear_object (&priv->server_list_monitor); g_clear_object (&priv->volume_monitor); + g_clear_object (&priv->network_monitor); g_clear_object (&priv->cancellable); g_clear_object (&priv->networks_fetching_cancellable); g_clear_object (&priv->path_size_group); @@ -898,6 +901,40 @@ update_network_state (GtkPlacesView *view) } } +static void +monitor_network (GtkPlacesView *self) +{ + GtkPlacesViewPrivate *priv; + GFile *network_file; + GError *error; + + priv = gtk_places_view_get_instance_private (self); + + if (priv->network_monitor) + return; + + error = NULL; + network_file = g_file_new_for_uri ("network:///"); + priv->network_monitor = g_file_monitor (network_file, + G_FILE_MONITOR_NONE, + NULL, + &error); + + g_clear_object (&network_file); + + if (error) + { + g_warning ("Error monitoring network: %s", error->message); + g_clear_error (&error); + return; + } + + g_signal_connect_swapped (priv->network_monitor, + "changed", + G_CALLBACK (update_places), + self); +} + static void populate_networks (GtkPlacesView *view, GFileEnumerator *enumerator, @@ -971,6 +1008,7 @@ network_enumeration_next_files_finished (GObject *source_object, if (!priv->destroyed) { update_network_state (view); + monitor_network (view); update_loading (view); } } -- 2.30.2